平衡二叉树
前言:本文对于平衡二叉树的原理讲解不是很透彻,建议先参考别的文章,大概了解整个过程再来仔细阅读此文。
另:为了方面实现,使用了C++引用参数。若要转化为C语言,使用指针即可。
基本概念
定义
平衡二叉查找树( Balanced Binary Sort Tree ) 简称平衡二叉树。我们平时说的平衡二叉树实际上指的是高度平衡的二叉树。亦可以称为 AVL 树。
性质
任何一个结点的左子树和右子树都是平衡二叉树,且左子树和右子树的高度之差的绝对值不超过1。
平衡因子:该结点的左子树高度减去其右子树的高度。所有结点的平衡因子只可能为-1、0、1。如果不是以上三个数,则这棵树失去了平衡。
平衡二叉树是一种特殊的二叉排序树。即该结点的值大于其左孩子的值,且小于其右孩子的值。
图示:
基本操作
结构定义
#define TRUE 1
#define FALSE 0
#define LH +1 //左高
#define EH 0 //等高
#define RH -1 //右高
typedef int Status;
typedef int KeyType;
//RcdType结构
typedef struct {
KeyType key;
}RcdType;
//BBST结构
typedef struct BBSTNode{
RcdType data;
int bf; //平衡因子
struct BBSTNode *lchild, *rchild;
}BBSTnode,*BBSTree;
平衡二叉树的失衡与调整
基础认识
插入或删除一个结点后,从该结点的位置起向上寻找第一个不平衡的结点( 平衡因子 bf 变成了 -2 或 2 ),以确定该树是否失衡。若找到,则以该结点为根的子树称为最小失衡子树。
调整平衡的过程实际上是由下往上进行平衡因子的更新与保持树平衡的过程。
失衡情况及调整方法
可将最小失衡子树的调整操作归纳以下情况:
- LL型:在最小失衡子树的左孩子的左子树上插入了新的结点
- RR型:在最小失衡子树的右孩子的右子树上插入了新的结点
- LR型:在最小失衡子树的左孩子的右子树上插入了新的结点
- RL型:在最小失衡子树的右孩子的左子树上插入了新的结点
各种情况处理方法
- LL型:右旋处理
- RR型:左旋处理
- LR型:先左旋再右旋
- RL型:先右旋再左旋
图示:
代码( 左旋与右旋 )
//右旋调整
void R_Rotate(BBSTree &p){
BBSTree lc